package com.xuecheng.content.service.impl;

import com.xuecheng.content.mapper.CourseCategoryMapper;
import com.xuecheng.content.model.dto.CourseCategoryTreeDTO;
import com.xuecheng.content.service.CourseCategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @author jiangzhongxun
 * @version 1.0
 * @description 课程分类相关操作
 * @date 2023-03-08 20:21
 */
@Slf4j
@Service
public class CourseCategoryServiceImpl implements CourseCategoryService {
    @Resource
    CourseCategoryMapper courseCategoryMapper;

    /**
     * 查询课程分类-树形结构
     *
     * @param id id
     * @return {@link List}<{@link CourseCategoryTreeDTO}>
     */
    @Override
    public List<CourseCategoryTreeDTO> queryTreeNodes1(String id) {
        // 得到了根结点下边的所有子结点
        List<CourseCategoryTreeDTO> categoryTreeDtos = courseCategoryMapper.selectTreeNodes1(id);
        // 定义 一个List作为最终返回的数据
        List<CourseCategoryTreeDTO> courseCategoryTreeDtos = new ArrayList<>();
        // 为了方便找子结点的父结点，定义 一个map
        HashMap<String, CourseCategoryTreeDTO> nodeMap = new HashMap<>();
        // 将数据封装到List中，只包括了根结点的直接下属结点
        categoryTreeDtos.stream().forEach(item -> {
            nodeMap.put(item.getId(), item);
            if (item.getParentid().equals(id)) {
                courseCategoryTreeDtos.add(item);
            }
            // 找到该结点的父结点
            String parentid = item.getParentid();
            // 找到该结点的父结点对象
            CourseCategoryTreeDTO parentNode = nodeMap.get(parentid);
            if (parentNode != null) {
                List childrenTreeNodes = parentNode.getChildrenTreeNodes();
                if (childrenTreeNodes == null) {
                    parentNode.setChildrenTreeNodes(new ArrayList<CourseCategoryTreeDTO>());
                }
                // 找到子结点，放到它的父结点的childrenTreeNodes属性中
                parentNode.getChildrenTreeNodes().add(item);
            }
        });
        // 返回的list中只包括了根结点的直接下属结点
        return courseCategoryTreeDtos;
    }

    /**
     * 查询课程分类-树形结构
     *
     * @return {@link List}<{@link CourseCategoryTreeDTO}>
     */
    @Override
    public List<CourseCategoryTreeDTO> queryTreeNodes() {
        return courseCategoryMapper.selectTreeNodes();
    }

}
